package com.jsh.erp.controller;

import com.alibaba.fastjson.JSONObject;
import com.jsh.erp.constants.BusinessConstants;
import com.jsh.erp.service.CommonQueryManager;
import com.jsh.erp.utils.*;
import io.swagger.annotations.Api;
import io.swagger.annotations.ApiOperation;
import org.springframework.web.bind.annotation.*;

import javax.annotation.Resource;
import javax.servlet.http.HttpServletRequest;
import java.util.ArrayList;
import java.util.HashMap;
import java.util.List;
import java.util.Map;

import static com.jsh.erp.utils.ResponseJsonUtil.returnJson;

@RestController
@Api(tags = {"资源接口"})
public class ResourceController {

    @Resource
    private CommonQueryManager configResourceManager;

    /**
     *  零售管理——零售出库——查询列表
     *          零售退货——查询列表、关联订单列表
     *  采购管理——请购单——查询列表、关联订单列表、历史单据列表
     *          采购订单——查询列表、关联订单列表和销售订单列表、历史单据列表
     *          采购入库——查询列表、关联订单列表、历史单据列表
     *          采购退货——查询列表、关联订单列表
     *  销售管理——销售订单——查询列表、历史单据列表
     *           销售出库——查询列表、关联订单列表、历史单据列表
     *           销售退货——查询列表、关联订单列表
     *  财务管理——收款单——查询列表
     *          付款单——查询列表
     *          收预付款——查询列表
     *  报表查询——客户对账——点击欠款详情的历史收款
     *          供应商对账——点击欠款详情的历史收款
     *  商品管理——商品信息——查询列表
     *          计量单位——查询列表
     *          多属性——查询列表
     *  基本资料——供应商信息——查询列表
     *          客户信息——查询列表
     *          会员信息——查询列表
     *          仓库信息——查询列表
     *          结算账户——查询列表
     *          经手人管理——查询列表
     *  系统管理——角色管理——查询列表
     *          用户管理——查询列表
     *          日志管理——查询列表
     *          系统配置——查询列表
     */
    @GetMapping(value = "/{apiName}/list")
    @ApiOperation(value = "获取所有信息列表")
    public String getList(@PathVariable("apiName") String apiName,
                        @RequestParam(value = Constants.PAGE_SIZE, required = false) Integer pageSize,
                        @RequestParam(value = Constants.CURRENT_PAGE, required = false) Integer currentPage,
                        @RequestParam(value = Constants.SEARCH, required = false) String search,
                        HttpServletRequest request)throws Exception {
        Map<String, String> parameterMap = ParamUtils.requestToMap(request);
        parameterMap.put(Constants.SEARCH, search);
        Map<String, Object> objectMap = new HashMap<String, Object>();
        if (pageSize != null && pageSize <= 0) {
            pageSize = 10;
        }
        String offset = ParamUtils.getPageOffset(currentPage, pageSize);
        if (StringUtil.isNotEmpty(offset)) {
            parameterMap.put(Constants.OFFSET, offset);
        }
        List<?> list = configResourceManager.select(apiName, parameterMap);
        if (list != null) {
            objectMap.put("total", configResourceManager.counts(apiName, parameterMap));
            objectMap.put("rows", list);
            return returnJson(objectMap, ErpInfo.OK.name, ErpInfo.OK.code);
        } else {
            objectMap.put("total", BusinessConstants.DEFAULT_LIST_NULL_NUMBER);
            objectMap.put("rows", new ArrayList<Object>());
            return returnJson(objectMap, "查找不到数据", ErpInfo.OK.code);
        }
    }

    /**
     * 商品管理——商品类别——新增
     *         商品信息——新增
     *         计量单位——新增
     *         多属性——新增
     * 基本资料——供应商信息——新增
     *         客户信息——新增
     *         会员信息——新增
     *         结算账户——新增
     *         经手人管理——新增
     * 系统管理——角色管理——新增
     *                 分配功能新增
     *         用户管理——分配客户新增
     *                 分配仓库新增
     *         机构管理—新增
     */
    @PostMapping(value = "/{apiName}/add", produces = {"application/javascript", "application/json"})
    @ApiOperation(value = "新增角色")
    public String addResource(@PathVariable("apiName") String apiName,
                              @RequestBody JSONObject obj, HttpServletRequest request)throws Exception {
        Map<String, Object> objectMap = new HashMap<String, Object>();
        int insert = configResourceManager.insert(apiName, obj, request);
        if(insert > 0) {
            return returnJson(objectMap, ErpInfo.OK.name, ErpInfo.OK.code);
        }else{
            return returnJson(objectMap, ErpInfo.ERROR.name, ErpInfo.ERROR.code);
        }
    }

    /**
     * 商品管理——商品类别——修改
     *         商品信息——修改
     *         计量单位——修改
     *         多属性——修改
     * 基本资料——供应商信息——修改
     *         客户信息——修改
     *         会员信息——修改
     *         仓库信息——修改
     *         结算账户——修改
     *         经手人管理——修改
     * 系统管理——角色管理——修改
     *                  分配功能修改
     *         用户管理——分配客户修改
     *                  分配仓库修改
     *         机构管理——修改
     *         系统配置——修改
     */
    @PutMapping(value = "/{apiName}/update", produces = {"application/javascript", "application/json"})
    @ApiOperation(value = "修改角色和权限")
    public String updateResource(@PathVariable("apiName") String apiName,
                                 @RequestBody JSONObject obj, HttpServletRequest request)throws Exception {
        Map<String, Object> objectMap = new HashMap<String, Object>();
        int update = configResourceManager.update(apiName, obj, request);
        if(update > 0) {
            return returnJson(objectMap, ErpInfo.OK.name, ErpInfo.OK.code);
        }else {
            return returnJson(objectMap, ErpInfo.ERROR.name, ErpInfo.ERROR.code);
        }
    }

    /**
     * 零售管理——零售出库——删除
     *          零售退货——删除
     * 采购管理——请购单——删除
     *          采购订单——删除
     *          采购入库——删除
     *          采购退货——删除
     * 销售管理——销售订单——删除
     *          销售出库——删除
     *          销售退货——删除
     * 财务管理——收款单——删除
     *          付款单——删除
     *          收预付款——删除
     * 商品管理——商品信息——删除
     *         计量单位——删除
     *         多属性——删除
     * 基本资料——供应商信息——删除
     *         客户信息——删除
     *         会员信息——删除
     *         仓库信息——删除
     *         结算账户——删除
     *         经手人管理——删除
     * 系统管理——角色管理——删除
     *         用户管理——删除
     */
    @DeleteMapping(value = "/{apiName}/delete", produces = {"application/javascript", "application/json"})
    @ApiOperation(value = "删除角色")
    public String deleteResource(@PathVariable("apiName") String apiName,
                                 @RequestParam("id") Long id, HttpServletRequest request)throws Exception {
        Map<String, Object> objectMap = new HashMap<String, Object>();
        int delete = configResourceManager.delete(apiName, id, request);
        if(delete > 0) {
            return returnJson(objectMap, ErpInfo.OK.name, ErpInfo.OK.code);
        }else {
            return returnJson(objectMap, ErpInfo.ERROR.name, ErpInfo.ERROR.code);
        }
    }

    /**
     * 零售管理——零售出库——删除
     *          零售退货——删除
     * 采购管理——请购单——删除
     *          采购订单——删除
     *          采购入库——删除
     *          采购退货——删除
     * 销售管理——销售订单——删除
     *          销售出库——删除
     *          销售退货——删除
     * 财务管理——收款单——删除
     *          付款单——删除
     *          收预付款——删除
     * 商品管理——商品类别——删除
     *         商品信息——删除
     *         计量单位——删除
     *         多属性——删除
     * 基本资料——供应商信息——删除
     *         客户信息——删除
     *         会员信息——删除
     *         仓库信息——删除
     *         结算账户——删除
     *         经手人管理——删除
     * 系统管理——角色管理——删除
     *         用户管理——删除
     *         机构管理——删除
     */
    @DeleteMapping(value = "/{apiName}/deleteBatch", produces = {"application/javascript", "application/json"})
    @ApiOperation(value = "批量删除")
    public String batchDeleteResource(@PathVariable("apiName") String apiName,
                                      @RequestParam("ids") String ids, HttpServletRequest request)throws Exception {
        Map<String, Object> objectMap = new HashMap<String, Object>();
        int delete = configResourceManager.deleteBatch(apiName, ids, request);
        if(delete > 0) {
            return returnJson(objectMap, ErpInfo.OK.name, ErpInfo.OK.code);
        }else {
            return returnJson(objectMap, ErpInfo.ERROR.name, ErpInfo.ERROR.code);
        }
    }

    /**
     * 商品管理——商品类别——修改和新增前查询名称是否存在
     *         多属性——修改和新增前查询名称是否存在
     * 基本资料——仓库信息——修改和新增前查询名称是否存在
     *         结算账户——修改和新增前查询名称是否存在
     *         经手人管理——修改和新增前查询名称是否存在
     * 系统管理——角色管理——修改和新增前查询名称是否存在
     *         机构管理——修改和新增前查询名称是否存在
     */
    @GetMapping(value = "/{apiName}/checkIsNameExist")
    @ApiOperation(value = "检查角色名称是否存在")
    public String checkIsNameExist(@PathVariable("apiName") String apiName,
                                   @RequestParam Long id, @RequestParam(value ="name", required = false) String name,
                                   HttpServletRequest request)throws Exception {
        Map<String, Object> objectMap = new HashMap<String, Object>();
        int exist = configResourceManager.checkIsNameExist(apiName, id, name);
        if(exist > 0) {
            objectMap.put("status", true);
        } else {
            objectMap.put("status", false);
        }
        return returnJson(objectMap, ErpInfo.OK.name, ErpInfo.OK.code);
    }

    /**
     * 零售管理——零售出库——新增时选择会员卡号
     */
    @GetMapping(value = "/{apiName}/info")
    @ApiOperation(value = "销售出库会员卡——根据id获取信息")
    public String getList(@PathVariable("apiName") String apiName,
                          @RequestParam("id") Long id,
                          HttpServletRequest request) throws Exception {
        Object obj = configResourceManager.selectOne(apiName, id);
        Map<String, Object> objectMap = new HashMap<String, Object>();
        if(obj != null) {
            objectMap.put("info", obj);
            return returnJson(objectMap, ErpInfo.OK.name, ErpInfo.OK.code);
        } else {
            return returnJson(objectMap, ErpInfo.ERROR.name, ErpInfo.ERROR.code);
        }
    }
}
